#ifndef __TCP_CHAT_BAR_H__
#define __TCP_CHAT_BAR_H__

#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include <signal.h>
#include <sys/time.h>
#include "threads_pool.h"

#define RUNNING 1
#define READY   0
#define FINISH  -1

// 进程状态
static volatile int status;

// 网络套接字地址描述
typedef 
struct sockaddr_in
InetSockAddrDesc_st, *InetSockAddrDesc_st_pt;

// 通用套接字地址描述
typedef
struct sockaddr
GenSockAddrDesc_st, *GenSockAddrDesc_st_pt;

// 时间值信息
typedef
struct timeval
TimeValMsg_st, *TimeValMsg_st_pt;

// 客户端连接信息
typedef
struct clientConnMsg
{
    int connSockFd;                                 /**< 连接套接字 */
    socklen_t inetSockAddrDescLen;                  /**< 网络套接字地址描述长度 */
    InetSockAddrDesc_st_pt svrInetSockAddrDescStPt; /**< 服务器网络套接字地址描述指针 */
    int bufSize;                                    /**< 缓冲区大小 */                       
    char* rdBufPt;                                  /**< 读缓冲区指针 */
    char* wtBufPt;                                  /**< 写缓冲区指针 */
}
ClientConnMsg_st, *ClientConnMsg_st_pt;

// 服务器连接信息
typedef 
struct serverConnMsg
{
    int lisentSockFd;                                   /**< 监听套接字 */
    int connSockFd;                                     /**< 连接套接字 */
    TimeValMsg_st_pt listenTimeOutValMsgStPt;           /**< 监听超时值信息指针 */
    socklen_t inetSockAddrDescLen;                      /**< 网络套接字地址描述长度 */
    InetSockAddrDesc_st_pt listenInetSockAddrDescStPt;  /**< 监听网络套接字地址描述指针 */
    InetSockAddrDesc_st_pt clientInetSockAddrDescStPt;  /**< 客户端网络套接字地址描述指针 */    
    int bufSize;                                        /**< 缓冲区大小 */ 
    char* rdBufPt;                                      /**< 读缓冲区指针 */
    char* wtBufPt;                                      /**< 写缓冲区指针 */
}
ServerConnMsg_st, *ServerConnMsg_st_pt;

// 获取新客户端连接信息
ClientConnMsg_st_pt getNewClientConnMsg (
    const const char* portNumPt,      /**< 端口号指针 */
    const const char* svrIPaddrPt,    /**< 服务器IP地址指针 */
    int bufSize                 /**< 缓冲区大小 */                       
);

//客户端请求连接服务器
int clientConnect2Server (
    ClientConnMsg_st_pt clientConnMsgStPt   /**< 客户端连接信息指针 */
);

// 销毁客户端连接信息
void destroyClientConnMsg (
    ClientConnMsg_st_pt clientConnMsgStPt   /**< 客户端连接信息指针 */
);

// 获取新服务器连接信息
ServerConnMsg_st_pt getNewServerConnMsg (
    const char* portNumPt,        /**< 端口号指针 */
    int bufSize,            /**< 缓冲区大小 */ 
    long timeOutSecs,       /**< 超时秒数 */
    long timeOutMicroSecs   /**< 超时微秒数 */
);

// 销毁服务器连接信息
void destroyServerConnMsg (
    ServerConnMsg_st_pt svrConnMsgStPt  /**< 服务器连接信息指针 */
);



#endif